/**
 * @Title: DataModule.java.
 * @Package cn.edu.hyit.kq.entity
 * Copyright: Copyright (c) 2016年5月4日
 * Company:HYIT
 * Organization: 略
 * @author Yuyang Zhang
 * @date 2016年5月4日 上午10:48:45
 * @version V1.0
 */
package cn.edu.hyit.zhao.entity;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

/**
 * <p>Class Name: DataModule.</p>
 * <p>Description: 转换属性到字符串</p>
 * <p>Sample: 修改toString方法输出实体的所有属性为字符串</p>
 * <p>Author: Yuyang Zhang</p>
 * <p>Date: 2016年5月4日</p>
 * <p>Modified History: 修改记录，(Yuyang Zhang)  (Version 1.0)  (2016年5月4日) (Reason & Contents)</p>
 */
public class DataModule {
    @Override
    public String toString() {
        int count = 0;
        try {
            StringBuilder sb = new StringBuilder("{");
            Class c = this.getClass();
            Field[] fields = c.getDeclaredFields();
            for (Field field : fields) {
                if (Modifier.PRIVATE == field.getModifiers()) { //将对象中的私有属性进行输出
                    Object v = invokeMethod(this, field.getName(), null);
                    if (count != 0) {
                        sb.append(",");
                    }
                    sb.append(field.getName() + ":" + v);
                    count++;
                }
            }
            sb.append("}");
            return sb.toString();
        } catch (Exception e) {
            System.out.println(this.getClass().getName() + " can't toString");
            e.printStackTrace();
            return "{}";
        }
    }

    /*
     * 通过属性的getter方法，获取对象属性的值
     * 属性不存在getter方法，返回null
     */
    private Object invokeMethod(Object object, String methodName, Object[] args) throws Exception {
        Class objectClass = object.getClass();
        methodName = methodName.substring(0, 1).toUpperCase() + methodName.substring(1); //提取属性首字母大写
        Method method = null;
        try {
            method = objectClass.getMethod("get" + methodName);
        } catch (SecurityException e) {
        } catch (NoSuchMethodException e) {
            //return "can't find 'get" + methodName + "' method";
            return null;
        }
        return method.invoke(object);
    }
}
